/***********************************************************************************
  *FileName:  adc.c
  *Version:   V1.0
  *Date:      2024-10-21
****************************************Includes************************************/
#include "adc.h"
#include "nsuc16xx_conf.h"
#include "misc.h"
/***************************************Variables***********************************/
#define ADC_CH 1

int16_t g_adcData[ADC_CH] = { 0 };
uint8_t g_adcCnvStats = 0;

/***************************************Functions***********************************/
/**
 * @brief  
 * @param None
 * @retval None
 */

/**
 * @brief set interrupt priority 
 * @param None
 * @retval None
 */
void ADC_NVIC(void)
{
    LL_NVIC_EnableIRQ(ADC_IRQn);                       /* 使能ADC全局中断 */
    LL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_1); /* set interrupt Group priority */
    LL_NVIC_SetPriority(ADC_IRQn, 0, 1);               /*  */
}

/**
 * @brief ADC Initialization
 * @param None
 * @retval None
 */
void ADCInit(void)
{
    ADC_NVIC(); /* 中断初始化 */

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC, ENABLE);  /* 使能ADC时钟 */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIO, ENABLE); /* 使能GPIO时钟 */

    GPIO_PinAFConfig(GPIO_PinSource0, GPIO1_AF_ADC1); /* GPIO复用ADC功能 */

    ADC_InitTypeDef ADC_InitStruct;                          /* ADC权柄 */
    ADC_InitStruct.ADC_ClockSource = ADC_ClockSource_32M;    /* 32MHZ */
    ADC_InitStruct.ADC_ConvMode = ADC_ConvMode_Single;       /* 使能单端模式 */
    ADC_InitStruct.ADC_ConvTimeCyecles = 0x30;               /* 数据转换时间：t(ADCCONV) = (CONV[5:0] + 1) / f(sys) */
    ADC_InitStruct.ADC_OnDelayTimeCyecles = 0x20;            /* 触发延时时间：t(ADCOndly) = (ONDLY[5:0] + 1) / f(sys) */
    ADC_InitStruct.ADC_RefVoltageSource = ADC_VRef_Internal; /* ADC 序列转换参考电压选择:内部参考电压 */
    ADC_InitStruct.ADC_SampleTimeCyecles = 0x31;             /* 采样保持时间：t(ADCSamp) = (SAMP[5:0] + 1) / f(sys) */
    ADC_InitStruct.ADC_StableTimeCyecles = 0x25;             /* 转换等待时间：t(ADCStable) = (STABLE[5:0] + 1) / f(sys) */
    ADC_InitStruct.ADC_TrigSource = ADC_TrigSource_Software; /* 触发事件来源：软件触发 */
    ADC_Init(ADC, &ADC_InitStruct);                          /* ADC初始化 */

		
    ADC_QueueConfig(ADC, ADC_Queue_Rank1, ADC_Channel_BVDD, ADC_PGA_Gain_1, ENABLE); /* ADC队列配置 */

    ADC_ITConfig(ADC, ADC_IT_EOC, ENABLE); /* 使能ADC转换完成中断 */
    ADC_Cmd(ADC, ENABLE);                  /* 启用ADC外围设备 */

    ADC_SoftwareStartConvCmd(ADC, ENABLE); /* 启用ADC软件转换 */
}

/**
 * @brief ADC测试函数 
 * @param None
 * @retval None
 */
void ADC_Test(void)
{
    if (g_adcCnvStats != 0)
    {
        ADC_SoftwareStartConvCmd(ADC, ENABLE); /* 启用ADC软件转换 */
        g_adcCnvStats = 0;
    }
    else
    {
        /* 继续 */
    }
}

/**
 * @brief ADC中断回调函数 
 * @param None
 * @retval None
 */
void ADC_ITHandler(void)
{
    if (ADC_GetITStatus(ADC, ADC_IT_EOC) == SET)
    {
        g_adcData[0] = ADC_GetQueueRankValue(ADC, ADC_Queue_Rank1);
        g_adcCnvStats = 1;
        ADC_ClearITPendingBit(ADC, ADC_IT_EOC); /* 清除ADC中断标志位 */
    }
}

/***************************************END OF FILE*********************************/
